import java.util.Deque;
import java.util.LinkedList;

public class MinStack {
    Deque<Integer> xStack;
    Deque<Integer> minStack;

    public MinStack() {
        xStack = new LinkedList<Integer>();
        minStack = new LinkedList<Integer>();
        minStack.push(Integer.MAX_VALUE); // 初始化最小值栈，确保 minStack 不为空
    }

    public void push(int x) {
        xStack.push(x);
        minStack.push(Math.min(minStack.peek(), x)); // 更新最小值栈
    }

    public void pop() {
        xStack.pop(); // 弹出 xStack 的栈顶元素
        minStack.pop(); // 同时弹出 minStack 的栈顶元素
    }

    public int top() {
        return xStack.peek(); // 返回 xStack 的栈顶元素
    }

    public int getMin() {
        return minStack.peek(); // 返回 minStack 的栈顶元素，即当前最小值
    }

    public static void main(String[] args) {
        MinStack minStack = new MinStack();
        minStack.push(-2);
        minStack.push(0);
        minStack.push(-3);
        System.out.println("Current minimum: " + minStack.getMin()); // 应该输出 -3
        minStack.pop();
        System.out.println("Top element: " + minStack.top()); // 应该输出 0
        System.out.println("Current minimum: " + minStack.getMin()); // 应该输出 -2
    }
}